{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "my_arr = np.arange(1000000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "my_list = list(range(1000000))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 22.6 ms, sys: 13.9 ms, total: 36.5 ms\n",
      "Wall time: 37.1 ms\n"
     ]
    }
   ],
   "source": [
    "%time for _ in range(10): my_arr2 = my_arr * 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 770 ms, sys: 214 ms, total: 984 ms\n",
      "Wall time: 1.1 s\n"
     ]
    }
   ],
   "source": [
    "%time for _ in range(10): my_list2 = [x * 2 for x in my_list]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.1 The Numpy ndarray: A Multidimensional Array Object"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# generate some random data\n",
    "data = np.random.randn(2, 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.85363732, -0.56717341,  0.50094684],\n",
       "       [-0.00996199, -1.09040038,  0.76988769]])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  8.53637325,  -5.67173414,   5.00946838],\n",
       "       [ -0.09961989, -10.90400378,   7.6988769 ]])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data * 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.70727465, -1.13434683,  1.00189368],\n",
       "       [-0.01992398, -2.18080076,  1.53977538]])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data + data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, 3)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('float64')"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.dtype"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Creating ndarrays"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "data1 = [6, 7.5, 8, 0, 1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr1 = np.array(data1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([6. , 7.5, 8. , 0. , 1. ])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr2 = np.array(data2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2, 3, 4],\n",
       "       [5, 6, 7, 8]])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2.ndim"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, 4)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.zeros(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.zeros((10,))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0.]])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.zeros((3, 6))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[1.49166815e-154, 1.49166815e-154],\n",
       "        [4.44659081e-323, 0.00000000e+000],\n",
       "        [0.00000000e+000, 0.00000000e+000]],\n",
       "\n",
       "       [[0.00000000e+000, 0.00000000e+000],\n",
       "        [0.00000000e+000, 0.00000000e+000],\n",
       "        [0.00000000e+000, 0.00000000e+000]]])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.empty((2, 3, 2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange(15)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Data Types for ndarrays"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr1 = np.array([1, 2, 3], dtype=np.float64)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr2 = np.array([1, 2, 3], dtype=np.int32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('float64')"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr1.dtype"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('int32')"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2.dtype"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1., 2., 3.])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.array([1, 2, 3, 4, 5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('int64')"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.dtype"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "float_arr = arr.astype(np.float64)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('float64')"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "float_arr.dtype"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 3.7, -1.2, -2.6,  0.5, 12.9, 10.1])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 3, -1, -2,  0, 12, 10], dtype=int32)"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.astype(np.int32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "numeric_strings = np.array(['1.25', '-9.6', '42'], dtype=np.string_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.25, -9.6 , 42.  ])"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "numeric_strings.astype(float)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "int_array = np.arange(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "calibers = np.array([.22, .270, .357, .380, .44, .50], dtype=np.float64)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "int_array.astype(calibers.dtype)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "empty_uint32 = np.empty(8, dtype='u4')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([         0, 1075314688,          0, 1075707904,          0,\n",
       "       1075838976,          0, 1072693248], dtype=uint32)"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "empty_uint32"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Arithmetic with Numpy Arrays"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.array([[1., 2., 3.], [4., 5., 6.]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 2., 3.],\n",
       "       [4., 5., 6.]])"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.,  4.,  9.],\n",
       "       [16., 25., 36.]])"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr * arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0.],\n",
       "       [0., 0., 0.]])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr - arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.        , 0.5       , 0.33333333],\n",
       "       [0.25      , 0.2       , 0.16666667]])"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1 / arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.        , 1.41421356, 1.73205081],\n",
       "       [2.        , 2.23606798, 2.44948974]])"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr ** 0.5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr2 = np.array([[0., 4., 1.], [7., 2., 12.]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.,  4.,  1.],\n",
       "       [ 7.,  2., 12.]])"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False,  True, False],\n",
       "       [ True, False,  True]])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2 > arr"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Basic Indexing and Slicing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.arange(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([5, 6, 7])"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[5:8]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr[5:8] = 12"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0,  1,  2,  3,  4, 12, 12, 12,  8,  9])"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr_slice = arr[5:8]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([12, 12, 12])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr_slice"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr_slice[1] = 12345"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([    0,     1,     2,     3,     4,    12, 12345,    12,     8,\n",
       "           9])"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr_slice[:] = 64"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0,  1,  2,  3,  4, 64, 64, 64,  8,  9])"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([7, 8, 9])"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d[2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d[0][2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d[0, 2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[ 1,  2,  3],\n",
       "        [ 4,  5,  6]],\n",
       "\n",
       "       [[ 7,  8,  9],\n",
       "        [10, 11, 12]]])"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr3d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, 2, 3)"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr3d.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2, 3],\n",
       "       [4, 5, 6]])"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr3d[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "old_values = arr3d[0].copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr3d[0] = 42"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[42, 42, 42],\n",
       "        [42, 42, 42]],\n",
       "\n",
       "       [[ 7,  8,  9],\n",
       "        [10, 11, 12]]])"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr3d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr3d[0] = old_values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[ 1,  2,  3],\n",
       "        [ 4,  5,  6]],\n",
       "\n",
       "       [[ 7,  8,  9],\n",
       "        [10, 11, 12]]])"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr3d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([7, 8, 9])"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr3d[1, 0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = arr3d[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 7,  8,  9],\n",
       "       [10, 11, 12]])"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([7, 8, 9])"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0,  1,  2,  3,  4, 64, 64, 64,  8,  9])"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1,  2,  3,  4, 64])"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[1:6]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2, 3],\n",
       "       [4, 5, 6],\n",
       "       [7, 8, 9]])"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2, 3],\n",
       "       [4, 5, 6]])"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d[:2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2, 3],\n",
       "       [5, 6]])"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d[:2, 1:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([4, 5])"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d[1, :2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3, 6])"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d[:2, 2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1],\n",
       "       [4],\n",
       "       [7]])"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d[:, :1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr2d[:2, 1:] = 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 0, 0],\n",
       "       [4, 0, 0],\n",
       "       [7, 8, 9]])"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Boolean Indexing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [],
   "source": [
    "names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = np.random.randn(7, 4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4')"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.56385359,  1.5497717 ,  0.53817865,  1.86166085],\n",
       "       [ 0.70052472, -0.96941229, -1.215252  ,  1.93886788],\n",
       "       [-0.99507911, -1.24602306,  0.49958057, -0.41642506],\n",
       "       [ 1.07633489,  0.55307124, -0.53226795, -0.95540171],\n",
       "       [ 0.75983177,  1.18886355,  0.35840697,  1.09943351],\n",
       "       [-0.04555165, -0.61164083,  0.49888453,  0.04035683],\n",
       "       [-0.66255494, -0.71541506,  0.77545257,  0.73610697]])"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True, False, False,  True, False, False, False])"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "names == 'Bob'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.56385359,  1.5497717 ,  0.53817865,  1.86166085],\n",
       "       [ 1.07633489,  0.55307124, -0.53226795, -0.95540171]])"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[names == 'Bob']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.53817865,  1.86166085],\n",
       "       [-0.53226795, -0.95540171]])"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[names == 'Bob', 2:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.86166085, -0.95540171])"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[names == 'Bob', 3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False,  True,  True, False,  True,  True,  True])"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "names != 'Bob'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.70052472, -0.96941229, -1.215252  ,  1.93886788],\n",
       "       [-0.99507911, -1.24602306,  0.49958057, -0.41642506],\n",
       "       [ 0.75983177,  1.18886355,  0.35840697,  1.09943351],\n",
       "       [-0.04555165, -0.61164083,  0.49888453,  0.04035683],\n",
       "       [-0.66255494, -0.71541506,  0.77545257,  0.73610697]])"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[~(names == 'Bob')]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [],
   "source": [
    "cond = names == 'Bob'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.70052472, -0.96941229, -1.215252  ,  1.93886788],\n",
       "       [-0.99507911, -1.24602306,  0.49958057, -0.41642506],\n",
       "       [ 0.75983177,  1.18886355,  0.35840697,  1.09943351],\n",
       "       [-0.04555165, -0.61164083,  0.49888453,  0.04035683],\n",
       "       [-0.66255494, -0.71541506,  0.77545257,  0.73610697]])"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[~cond]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [],
   "source": [
    "mask = (names == 'Bob') | (names == 'Will')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True, False,  True,  True,  True, False, False])"
      ]
     },
     "execution_count": 106,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mask"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.56385359,  1.5497717 ,  0.53817865,  1.86166085],\n",
       "       [-0.99507911, -1.24602306,  0.49958057, -0.41642506],\n",
       "       [ 1.07633489,  0.55307124, -0.53226795, -0.95540171],\n",
       "       [ 0.75983177,  1.18886355,  0.35840697,  1.09943351]])"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[mask]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [],
   "source": [
    "data[data < 0] = 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.56385359, 1.5497717 , 0.53817865, 1.86166085],\n",
       "       [0.70052472, 0.        , 0.        , 1.93886788],\n",
       "       [0.        , 0.        , 0.49958057, 0.        ],\n",
       "       [1.07633489, 0.55307124, 0.        , 0.        ],\n",
       "       [0.75983177, 1.18886355, 0.35840697, 1.09943351],\n",
       "       [0.        , 0.        , 0.49888453, 0.04035683],\n",
       "       [0.        , 0.        , 0.77545257, 0.73610697]])"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [],
   "source": [
    "data[names != 'Joe'] = 7"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[7.        , 7.        , 7.        , 7.        ],\n",
       "       [0.70052472, 0.        , 0.        , 1.93886788],\n",
       "       [7.        , 7.        , 7.        , 7.        ],\n",
       "       [7.        , 7.        , 7.        , 7.        ],\n",
       "       [7.        , 7.        , 7.        , 7.        ],\n",
       "       [0.        , 0.        , 0.49888453, 0.04035683],\n",
       "       [0.        , 0.        , 0.77545257, 0.73610697]])"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Fancy Indexing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.empty((8, 4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(8):\n",
    "    arr[i] = i"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., 0.],\n",
       "       [1., 1., 1., 1.],\n",
       "       [2., 2., 2., 2.],\n",
       "       [3., 3., 3., 3.],\n",
       "       [4., 4., 4., 4.],\n",
       "       [5., 5., 5., 5.],\n",
       "       [6., 6., 6., 6.],\n",
       "       [7., 7., 7., 7.]])"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[4., 4., 4., 4.],\n",
       "       [3., 3., 3., 3.],\n",
       "       [0., 0., 0., 0.],\n",
       "       [6., 6., 6., 6.]])"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[[4, 3, 0, 6]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5., 5., 5., 5.],\n",
       "       [3., 3., 3., 3.],\n",
       "       [1., 1., 1., 1.]])"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[[-3, -5, -7]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.arange(32).reshape((8, 4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 4,  5,  6,  7],\n",
       "       [20, 21, 22, 23],\n",
       "       [28, 29, 30, 31],\n",
       "       [ 8,  9, 10, 11]])"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[[1, 5, 7, 2]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3],\n",
       "       [ 4,  5,  6,  7],\n",
       "       [ 8,  9, 10, 11],\n",
       "       [12, 13, 14, 15],\n",
       "       [16, 17, 18, 19],\n",
       "       [20, 21, 22, 23],\n",
       "       [24, 25, 26, 27],\n",
       "       [28, 29, 30, 31]])"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 4, 23, 29, 10])"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[[1, 5, 7, 2], [0, 3, 1, 2]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 4,  7,  5,  6],\n",
       "       [20, 23, 21, 22],\n",
       "       [28, 31, 29, 30],\n",
       "       [ 8, 11,  9, 10]])"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[[1,  5, 7,  2]][:, [0, 3, 1, 2]]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Transposing Arrays and Swapping Axes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.arange(15).reshape((3, 5))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3,  4],\n",
       "       [ 5,  6,  7,  8,  9],\n",
       "       [10, 11, 12, 13, 14]])"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  5, 10],\n",
       "       [ 1,  6, 11],\n",
       "       [ 2,  7, 12],\n",
       "       [ 3,  8, 13],\n",
       "       [ 4,  9, 14]])"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.random.randn(6, 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-1.80917016, -1.30419717,  0.49199559],\n",
       "       [-2.3270254 ,  0.07104416, -0.41835416],\n",
       "       [ 0.71053991, -0.03790918, -0.90471693],\n",
       "       [-2.37991675,  0.31979457, -0.32707899],\n",
       "       [-0.17529228, -0.19518484,  0.17363222],\n",
       "       [-1.30334725, -0.37985666,  0.20089745]])"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[16.58645603,  1.93547213, -0.07327524],\n",
       "       [ 1.93547213,  1.9920714 , -0.8518845 ],\n",
       "       [-0.07327524, -0.8518845 ,  1.41308119]])"
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.dot(arr.T, arr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[16.58645603,  1.93547213, -0.07327524],\n",
       "       [ 1.93547213,  1.9920714 , -0.8518845 ],\n",
       "       [-0.07327524, -0.8518845 ,  1.41308119]])"
      ]
     },
     "execution_count": 128,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.T.dot(arr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.arange(16).reshape((2, 2, 4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[ 0,  1,  2,  3],\n",
       "        [ 4,  5,  6,  7]],\n",
       "\n",
       "       [[ 8,  9, 10, 11],\n",
       "        [12, 13, 14, 15]]])"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[ 0,  1,  2,  3],\n",
       "        [ 8,  9, 10, 11]],\n",
       "\n",
       "       [[ 4,  5,  6,  7],\n",
       "        [12, 13, 14, 15]]])"
      ]
     },
     "execution_count": 131,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.transpose((1, 0, 2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[ 0,  4],\n",
       "        [ 1,  5],\n",
       "        [ 2,  6],\n",
       "        [ 3,  7]],\n",
       "\n",
       "       [[ 8, 12],\n",
       "        [ 9, 13],\n",
       "        [10, 14],\n",
       "        [11, 15]]])"
      ]
     },
     "execution_count": 132,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.swapaxes(1, 2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.2 Universal Functions: Fase Element-Wise Arrays Functions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.arange(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])"
      ]
     },
     "execution_count": 134,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.        , 1.        , 1.41421356, 1.73205081, 2.        ,\n",
       "       2.23606798, 2.44948974, 2.64575131, 2.82842712, 3.        ])"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sqrt(arr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01,\n",
       "       5.45981500e+01, 1.48413159e+02, 4.03428793e+02, 1.09663316e+03,\n",
       "       2.98095799e+03, 8.10308393e+03])"
      ]
     },
     "execution_count": 136,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.exp(arr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.random.randn(8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [],
   "source": [
    "y = np.random.randn(8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.60440088,  0.74984889, -0.62223685, -0.56237567,  0.56285952,\n",
       "       -0.62263426,  0.00978262,  0.00230419])"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.39976884,  0.85594027,  1.52147897, -0.47231396,  0.54422893,\n",
       "        0.28746034, -0.71070382,  0.37521533])"
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.60440088,  0.85594027,  1.52147897, -0.47231396,  0.56285952,\n",
       "        0.28746034,  0.00978262,  0.37521533])"
      ]
     },
     "execution_count": 141,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.maximum(x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.random.randn(7) * 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.43376516, -5.37852308,  2.6897913 , -4.01961397,  1.77036123,\n",
       "        3.76258878, -6.14466164])"
      ]
     },
     "execution_count": 143,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [],
   "source": [
    "remainder, whole_part = np.modf(arr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.43376516, -0.37852308,  0.6897913 , -0.01961397,  0.77036123,\n",
       "        0.76258878, -0.14466164])"
      ]
     },
     "execution_count": 145,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "remainder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1., -5.,  2., -4.,  1.,  3., -6.])"
      ]
     },
     "execution_count": 146,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "whole_part"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.43376516, -5.37852308,  2.6897913 , -4.01961397,  1.77036123,\n",
       "        3.76258878, -6.14466164])"
      ]
     },
     "execution_count": 147,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/gaussic/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:1: RuntimeWarning: invalid value encountered in sqrt\n",
      "  \"\"\"Entry point for launching an IPython kernel.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([1.19739933,        nan, 1.64005832,        nan, 1.33054922,\n",
       "       1.93973936,        nan])"
      ]
     },
     "execution_count": 148,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sqrt(arr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/gaussic/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:1: RuntimeWarning: invalid value encountered in sqrt\n",
      "  \"\"\"Entry point for launching an IPython kernel.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([1.19739933,        nan, 1.64005832,        nan, 1.33054922,\n",
       "       1.93973936,        nan])"
      ]
     },
     "execution_count": 149,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sqrt(arr, arr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.19739933,        nan, 1.64005832,        nan, 1.33054922,\n",
       "       1.93973936,        nan])"
      ]
     },
     "execution_count": 150,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.3 Array-Oriented Programming with Arrays"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {},
   "outputs": [],
   "source": [
    "points = np.arange(-5, 5, 0.01)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {},
   "outputs": [],
   "source": [
    "xs, ys = np.meshgrid(points, points)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-5.  , -5.  , -5.  , ..., -5.  , -5.  , -5.  ],\n",
       "       [-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99],\n",
       "       [-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],\n",
       "       ...,\n",
       "       [ 4.97,  4.97,  4.97, ...,  4.97,  4.97,  4.97],\n",
       "       [ 4.98,  4.98,  4.98, ...,  4.98,  4.98,  4.98],\n",
       "       [ 4.99,  4.99,  4.99, ...,  4.99,  4.99,  4.99]])"
      ]
     },
     "execution_count": 153,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ys"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],\n",
       "       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],\n",
       "       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],\n",
       "       ...,\n",
       "       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],\n",
       "       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],\n",
       "       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99]])"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {},
   "outputs": [],
   "source": [
    "z = np.sqrt(xs ** 2 + ys ** 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[7.07106781, 7.06400028, 7.05693985, ..., 7.04988652, 7.05693985,\n",
       "        7.06400028],\n",
       "       [7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815,\n",
       "        7.05692568],\n",
       "       [7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354,\n",
       "        7.04985815],\n",
       "       ...,\n",
       "       [7.04988652, 7.04279774, 7.03571603, ..., 7.0286414 , 7.03571603,\n",
       "        7.04279774],\n",
       "       [7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354,\n",
       "        7.04985815],\n",
       "       [7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815,\n",
       "        7.05692568]])"
      ]
     },
     "execution_count": 156,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "z"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1000, 1000)"
      ]
     },
     "execution_count": 157,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "z.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.meshgrid??"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(z, cmap=plt.cm.gray)\n",
    "plt.colorbar()\n",
    "plt.title('Image plot of $\\sqrt{x^2 + y^2}$ for a grid of values')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Expressing Conditional Logic as Array Operations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "metadata": {},
   "outputs": [],
   "source": [
    "xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "metadata": {},
   "outputs": [],
   "source": [
    "yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {},
   "outputs": [],
   "source": [
    "cond = np.array([True, False, True, True, False])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {},
   "outputs": [],
   "source": [
    "result = [(x if c else y) for x, y, c in zip(xarr, yarr, cond)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1.1, 2.2, 1.3, 1.4, 2.5]"
      ]
     },
     "execution_count": 165,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "metadata": {},
   "outputs": [],
   "source": [
    "result = np.where(cond, xarr, yarr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.1, 2.2, 1.3, 1.4, 2.5])"
      ]
     },
     "execution_count": 167,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.random.randn(4, 4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.84152358,  1.49773002, -1.45847634, -0.50049237],\n",
       "       [-0.26592902,  0.61189785,  0.30242848,  0.53834298],\n",
       "       [-2.44148805,  0.93134365, -0.49660989, -2.34091742],\n",
       "       [ 1.17503155, -1.03448561,  0.64630029,  0.09327327]])"
      ]
     },
     "execution_count": 169,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ True,  True, False, False],\n",
       "       [False,  True,  True,  True],\n",
       "       [False,  True, False, False],\n",
       "       [ True, False,  True,  True]])"
      ]
     },
     "execution_count": 170,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr > 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 2,  2, -2, -2],\n",
       "       [-2,  2,  2,  2],\n",
       "       [-2,  2, -2, -2],\n",
       "       [ 2, -2,  2,  2]])"
      ]
     },
     "execution_count": 171,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.where(arr > 0, 2, -2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.84152358,  1.49773002, -1.45847634, -0.50049237],\n",
       "       [-0.26592902,  0.61189785,  0.30242848,  0.53834298],\n",
       "       [-2.44148805,  0.93134365, -0.49660989, -2.34091742],\n",
       "       [ 1.17503155, -1.03448561,  0.64630029,  0.09327327]])"
      ]
     },
     "execution_count": 172,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 2.        ,  2.        , -1.45847634, -0.50049237],\n",
       "       [-0.26592902,  2.        ,  2.        ,  2.        ],\n",
       "       [-2.44148805,  2.        , -0.49660989, -2.34091742],\n",
       "       [ 2.        , -1.03448561,  2.        ,  2.        ]])"
      ]
     },
     "execution_count": 173,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.where(arr > 0, 2, arr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Mathematic and Statistical Methods"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.random.randn(5, 4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.20711453,  0.67845223,  0.88659086,  0.21199812],\n",
       "       [-0.41513092, -0.85099554, -0.50623041, -0.85856785],\n",
       "       [-0.62804953, -0.57789082,  0.56848526, -0.78435264],\n",
       "       [ 0.61207049,  0.31527863, -1.50890575, -0.27136817],\n",
       "       [-1.77320467, -2.04099584,  0.64179524, -0.66351396]])"
      ]
     },
     "execution_count": 175,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.3378710368004595"
      ]
     },
     "execution_count": 176,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.3378710368004595"
      ]
     },
     "execution_count": 177,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mean(arr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-6.75742073600919"
      ]
     },
     "execution_count": 178,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 179,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.49603894, -0.65773118, -0.35545193, -0.2132312 , -0.9589798 ])"
      ]
     },
     "execution_count": 179,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.mean(axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-1.9972001 , -2.47615135,  0.08173521, -2.3658045 ])"
      ]
     },
     "execution_count": 180,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.sum(axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.array([0, 1, 2, 3, 4, 5, 6, 7])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0,  1,  3,  6, 10, 15, 21, 28])"
      ]
     },
     "execution_count": 182,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.cumsum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 184,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1, 2],\n",
       "       [3, 4, 5],\n",
       "       [6, 7, 8]])"
      ]
     },
     "execution_count": 184,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2],\n",
       "       [ 3,  5,  7],\n",
       "       [ 9, 12, 15]])"
      ]
     },
     "execution_count": 185,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.cumsum(axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  0,   0,   0],\n",
       "       [  3,  12,  60],\n",
       "       [  6,  42, 336]])"
      ]
     },
     "execution_count": 186,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.cumprod(axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Methods for Boolean Arrays"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 187,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.random.randn(100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 188,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "49"
      ]
     },
     "execution_count": 188,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(arr > 0).sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 189,
   "metadata": {},
   "outputs": [],
   "source": [
    "bools = np.array([False, False, True, False])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 190,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 190,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bools.any()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 191,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 191,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bools.all()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Sorting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 192,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.random.randn(6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 193,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.02733403, -0.50449794, -0.48634109,  0.36916266,  1.04240979,\n",
       "       -0.30000852])"
      ]
     },
     "execution_count": 193,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 194,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr.sort()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 195,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.50449794, -0.48634109, -0.30000852,  0.02733403,  0.36916266,\n",
       "        1.04240979])"
      ]
     },
     "execution_count": 195,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.random.randn(5, 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 197,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.63102072, -0.65750999, -1.52141396],\n",
       "       [ 0.85694828,  0.81165799,  0.72011812],\n",
       "       [ 1.09886742,  0.38741711,  0.635476  ],\n",
       "       [ 1.6059142 ,  0.19151742,  0.37306039],\n",
       "       [-0.0236813 ,  1.02196422,  0.96662837]])"
      ]
     },
     "execution_count": 197,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 198,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr.sort(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 199,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-1.52141396, -0.65750999,  1.63102072],\n",
       "       [ 0.72011812,  0.81165799,  0.85694828],\n",
       "       [ 0.38741711,  0.635476  ,  1.09886742],\n",
       "       [ 0.19151742,  0.37306039,  1.6059142 ],\n",
       "       [-0.0236813 ,  0.96662837,  1.02196422]])"
      ]
     },
     "execution_count": 199,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 200,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr.sort(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 201,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-1.52141396, -0.65750999,  0.85694828],\n",
       "       [-0.0236813 ,  0.37306039,  1.02196422],\n",
       "       [ 0.19151742,  0.635476  ,  1.09886742],\n",
       "       [ 0.38741711,  0.81165799,  1.6059142 ],\n",
       "       [ 0.72011812,  0.96662837,  1.63102072]])"
      ]
     },
     "execution_count": 201,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 202,
   "metadata": {},
   "outputs": [],
   "source": [
    "large_arr = np.random.randn(1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 203,
   "metadata": {},
   "outputs": [],
   "source": [
    "large_arr.sort()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 204,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-1.6202897135849896"
      ]
     },
     "execution_count": 204,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "large_arr[int(0.05 * len(large_arr))]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Unique and Other Set Logic"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 205,
   "metadata": {},
   "outputs": [],
   "source": [
    "names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 206,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['Bob', 'Joe', 'Will'], dtype='<U4')"
      ]
     },
     "execution_count": 206,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.unique(names)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 207,
   "metadata": {},
   "outputs": [],
   "source": [
    "ints = np.array([3, 3, 3, 2, 2, 1, 1, 4, 4])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 208,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 2, 3, 4])"
      ]
     },
     "execution_count": 208,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.unique(ints)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 209,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Bob', 'Joe', 'Will']"
      ]
     },
     "execution_count": 209,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sorted(set(names))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 210,
   "metadata": {},
   "outputs": [],
   "source": [
    "values = np.array([6, 0, 0, 3, 2, 5, 6])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 211,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True, False, False,  True,  True, False,  True])"
      ]
     },
     "execution_count": 211,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.in1d(values, [2, 3, 6])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.4 File Input and Output with Arrays"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 212,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.arange(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 213,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.save('some_array', arr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 214,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])"
      ]
     },
     "execution_count": 214,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.load('some_array.npy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 215,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.savez('array_archive.npz', a=arr, b=arr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 216,
   "metadata": {},
   "outputs": [],
   "source": [
    "arch = np.load('array_archive.npz')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 217,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])"
      ]
     },
     "execution_count": 217,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arch['b']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 218,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.savez_compressed('array_compressed.npz', a=arr, b=arr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.5 Linear Algebra"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 219,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.array([[1., 2., 3.], [4., 5., 6.]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 220,
   "metadata": {},
   "outputs": [],
   "source": [
    "y = np.array([[6., 23.], [-1, 7], [8, 9]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 221,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 2., 3.],\n",
       "       [4., 5., 6.]])"
      ]
     },
     "execution_count": 221,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 222,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 6., 23.],\n",
       "       [-1.,  7.],\n",
       "       [ 8.,  9.]])"
      ]
     },
     "execution_count": 222,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 223,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 28.,  64.],\n",
       "       [ 67., 181.]])"
      ]
     },
     "execution_count": 223,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.dot(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 224,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 28.,  64.],\n",
       "       [ 67., 181.]])"
      ]
     },
     "execution_count": 224,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.dot(x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 225,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 6., 15.])"
      ]
     },
     "execution_count": 225,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.dot(x, np.ones(3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 226,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 6., 15.])"
      ]
     },
     "execution_count": 226,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x @ np.ones(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 227,
   "metadata": {},
   "outputs": [],
   "source": [
    "from numpy.linalg import inv, qr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 228,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.random.randn(5, 5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 229,
   "metadata": {},
   "outputs": [],
   "source": [
    "mat = X.T.dot(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 230,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  3.68511008,   6.06693133,  -6.2370572 ,  -1.67663171,\n",
       "         -1.42737313],\n",
       "       [  6.06693133,  10.62096306, -11.07479862,  -2.67434655,\n",
       "         -2.60794089],\n",
       "       [ -6.2370572 , -11.07479862,  11.93236934,   2.70006889,\n",
       "          2.80842358],\n",
       "       [ -1.67663171,  -2.67434655,   2.70006889,   1.99700176,\n",
       "          0.96452569],\n",
       "       [ -1.42737313,  -2.60794089,   2.80842358,   0.96452569,\n",
       "          0.89281869]])"
      ]
     },
     "execution_count": 230,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "inv(mat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 231,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.00000000e+00, -6.97339213e-16,  7.50096264e-16,\n",
       "         1.05015154e-15,  6.51458933e-16],\n",
       "       [-2.74726865e-15,  1.00000000e+00,  1.71038468e-15,\n",
       "        -2.73748966e-16,  9.52133034e-16],\n",
       "       [ 1.43464523e-15, -6.25499181e-15,  1.00000000e+00,\n",
       "        -1.11953389e-15,  2.52378292e-16],\n",
       "       [ 1.07960149e-15,  9.87262908e-17, -6.77804851e-16,\n",
       "         1.00000000e+00, -6.20015992e-16],\n",
       "       [-3.16051294e-15,  1.21386768e-15,  5.41924918e-18,\n",
       "         1.19037940e-15,  1.00000000e+00]])"
      ]
     },
     "execution_count": 231,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mat.dot(inv(mat))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 232,
   "metadata": {},
   "outputs": [],
   "source": [
    "q, r = qr(mat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 233,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-8.97344478,  7.76263492,  1.50441746, -2.49548848,  6.70735517],\n",
       "       [ 0.        , -4.28887226, -4.68113933, -1.54736632,  4.217934  ],\n",
       "       [ 0.        ,  0.        , -0.96972278, -1.21893126,  5.31899405],\n",
       "       [ 0.        ,  0.        ,  0.        , -0.97127968,  1.03888989],\n",
       "       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.23278848]])"
      ]
     },
     "execution_count": 233,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.6 Pseudorandom Number Generation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 234,
   "metadata": {},
   "outputs": [],
   "source": [
    "samples = np.random.normal(size=(4, 4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 235,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.37159788,  0.40970799,  0.29769604, -1.32861394],\n",
       "       [ 1.90913193,  0.77897364,  0.55148148, -0.74009086],\n",
       "       [ 1.44129611, -0.22144441, -1.21961036, -1.40882766],\n",
       "       [-0.155969  ,  0.63520686, -0.27484273,  0.05948411]])"
      ]
     },
     "execution_count": 235,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "samples"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 236,
   "metadata": {},
   "outputs": [],
   "source": [
    "from random import normalvariate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 237,
   "metadata": {},
   "outputs": [],
   "source": [
    "N = 1000000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 238,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "957 ms ± 113 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    }
   ],
   "source": [
    "%timeit samples = [normalvariate(0, 1) for _ in range(N)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 239,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "42.9 ms ± 10.9 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit np.random.normal(size=N)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 240,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(1234)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 241,
   "metadata": {},
   "outputs": [],
   "source": [
    "rng = np.random.RandomState(1234)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 242,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.47143516, -1.19097569,  1.43270697, -0.3126519 , -0.72058873,\n",
       "        0.88716294,  0.85958841, -0.6365235 ,  0.01569637, -2.24268495])"
      ]
     },
     "execution_count": 242,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rng.randn(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.7 Example: Random Walks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 243,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random\n",
    "position = 0\n",
    "walk = [position]\n",
    "steps = 1000\n",
    "for i in range(steps):\n",
    "    step = 1 if random.randint(0, 1) else -1\n",
    "    position += step\n",
    "    walk.append(position)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 244,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAD4CAYAAAAJmJb0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO29eXQr2X3f+f0BILiCKPBxJ1Fv399jo1pPS7djSe5uWe04UUuOfWKdmbhnsvSMTjyyvIxtHXk8cjJJJo49nmRkJ+5jeZMctSyNpNZYsmS1pWhzt9SvX+Ht++v3AG6P5CMKBDeAAO78UagCQBQIgEABBPD7nIND4qJQdWvBt2797m8hIQQYhmGY1sTR6A4wDMMw9sEizzAM08KwyDMMw7QwLPIMwzAtDIs8wzBMC+NqdAdyGRwcFAcOHGh0NxiGYZqKN954Y0kIMWT12Z4S+QMHDuD8+fON7gbDMExTQUQPin3G5hqGYZgWhkWeYRimhWGRZxiGaWFY5BmGYVoYFnmGYZgWxnaRJ6JniegmEd0hol+3e3sMwzBMFltFnoicAH4fwE8AOAXgg0R0ys5tMgzDMFnsHsm/DcAdIcQ9IUQCwEsAnqv1Rma0DfzO129iOrJe61UzDMM0NXaL/ASAcM776UybCRG9QETniej84uLirjayupnEJ751Bz+4t7z7njIMw7Qgdos8WbTlVSkRQrwohDgnhDg3NGQZlVuSI8N96Ot0IRjWdvV9hmGYVsVukZ8G4M95PwlgttYbcToIj/m9UMORWq+aYRimqbFb5F8HcJSIDhKRG8DPAviyHRtS/D5cn4thI5GyY/UMwzBNia0iL4RIAvh5AF8HcB3AXwohrtqxrYBfQiotcHkmasfqGYZhmhLbs1AKIb4K4Kt2bycgSwCAYDiCtx0csHtzDMMwTUHLRLwO9nVCHuiBGuLJV4ZhGIOWEXlAN9mwyDMMw2RpKZFXZAnzK5uYi240uisMwzB7ghYTeR8AIMijeYZhGAAtJvInxzxwOx1QOSiKYRgGQIuJfKfLidMT/VBDHBTFMAwDtJjIA3pQ1KXpKLZS6UZ3hWEYpuG0nMgHZAnxZBo352ON7kpVXJrW8Gg1XtB+Z2EV4WXOtskwTHm0nMgrfj0o6kITm2wSyTT+8R++ht/9xq2Czz706Tfwq5+/1IBeMQzTjLScyE/6ujHY19nUHjbX5lawsZXChQf5NyptPYHbC6sIhjUk2RzFMEwZtJzIExEUWWpqDxtj4vjmwxhW40mz3UilvLGVws2HzW2OYhimPrScyAN6UNSbS2uIrCUa3ZVdYYi5EMClnJtVsMj/DMMwxWhJkQ9k7PLB6eYUQjWk4cnD+/T/c8RcDWk4PuLBYJ+b0zcwDFMWLSnyU5MSHISmFMKl1ThCy+t417EhHBrqNfdBCIFgWIMiS5kcPc07scwwTP1oSZHv63Th2IinKYXQmDBWZB8Uvw/BcARCCLy5tIboxhYUWYIi+3B3cQ3R9a0G95ZhmL1OS4o8oIvkxbCGdFqUXngPEQxrcDoIZye8UGQJS6sJTEc2zBG9Lv66Oepik5qjGIapHy0s8hJWNpO4t7TW6K5UhBqO4OSYB91upzm3cCEUgRqOwNPpwpGhPpyd9IKa1BzFMEx9aV2RzwhkM5lsUmmBi+EoFL+eTfPEqAddHQ4EwxqCYQ2P+SU4HARPVweODXu4cDnDMCVpWZE/PNQHT6erqfzl7yysYjWeNEfwLqcDU5MSXr37CNfnYmY7oD+pBMMahGgucxTDMPXFNpEnov9ARDeI6BIRfZGIpNLfqh0OByEgS00V+RrMjMwVOUfM/RJuzMeQSou89oBfgra+hfuPOI8NwzDFsXMk/w0AZ4QQUwBuAfiojduyRBfIFawnkqUX3gOoIQ3e7g4cHOw127YLe7bdl/kOm2wYhimObSIvhPgbIYShrq8BmLRrW8VQZB/SArg0HS37O49W41huUKSsGtL94InIbDPEfP++Huzr6zTbjwz3oa/TxZOvDMPsSL1s8v8UwF9bfUBELxDReSI6v7i4WNONBszJ1/KF8EN/cQEf/oxa036Uw2o8iVsL+XZ3ABjp78KhwV684+C+vHang/CY38uTrwzD7Iirmi8T0SsARi0++pgQ4uXMMh8DkATwF1brEEK8COBFADh37lxNZxF9vW4c2Ndj2rpLEU+mEAxpcDiArVQaHc76zUtfCmsQIjtyz+Vz//MT6HY7C9oDfgl/+O172EikLD9nGIapSuSFEM/s9DkRPQ/gHwB4WjTIDUSRffjenSUIIfLMIFZcnV1BIpUGUsDN+RjOTHjr1MtsjprAZOH8dK6ZJhfF70MyLXBlNoq3HhiwtX8MwzQndnrXPAvg1wC8TwjRMBcQRZawGItjNrpZctlcs069JzTVUASHh3rh7eko+zsBufliARiGqS922iM+AcAD4BtEFCSi/2LjtopiZqQswy4fDGsY93ZhsK+zrv71RvKxgL/QVLMTg32d8A908+QrwzBFqcpcsxNCiCN2rbsSToz2o9PlgBqK4CenxnZcVg1FoMg+JFLpuvrXT0c2sLSayHOXLBfF78Pr95dt6BXDMK1Ay0a8GrhdDpyd8JYcmS/ENjEd2TBT+d6rY9ERox7trkReljAX3cRcdKPW3WIYpgVoeZEHdCG8PBNFIlm8Lmo2xa9kim29io6oIQ3dHU4cH/FU/F3DG6eZInsZhqkfbSHyAb8PiWQaN+ZXii4TDGvocBJOj3vNoiP1Es5gWMPZSS9cu3DZPDnmgdvpaKocPQzD1I+2EHlFLh0UpYY0nBzrR1eHM1t0pA7CGU+mcG12ZVemGgDodDlxeqKfPWwYhrGkLUR+zNuFkf7OokKYSgtcnNbM9MSAbgYJhiK2Fx0xfPOVCj1rclH8PlyajmIrVdwcxTBMe9IWIk9EUPy+oiPzWw9jWE+k8qJNFX99io6oOXMBu0WRJcSTadycj9WqWwzDtAhtIfKAHjj04NG6ZfKxoBFtui1fe+5ndmH45o/0d+16HYEmLJDCMEx9aBuRN0wxVnls1FAEvp4O7N/XY7aZRUcqEE4hBGKblRXXNnzzq2HS160HcLGHDcMw22gbkT876YXTQbjwoFAI1ZCGgD8/xa9RdORCBcL51cvzeOu/eQULsdIpFABgMRbHdGSjIPNkpRARFFky/e0ZhmEM2kbke9wunBj1FJhfVja3cGdxFY9bjKYVv4SbFRQd+e7tRWxupfHG/fLE1nhKeHx/9UWzFFnC/UfrdQvgYhimOWgbkQd02/XFsJbnMXMpHIUQ2WRfecvLEtICuFxm0RHjBlKuHT8Y1uBy6L751WLm6KlTABfDMM1BW4m8IvsQiydxd3HVbFNDERABj1mYTIyEYeX4y6/Gk7j5MJZZZ3lCq4Y0nBrXffOrxQjgYrs8wzC5tJnIFwZFqWENR4b60N9VmOJ3IFN0pJzJV6Pox5HhPlya0Ur6rFv55leDGcDFdnmGYXJoK5E/uK8X/V0uc2QuhIAaiuw48RnwS1BDGkrVPDHW+fyTB7C5Vdpn3fDNtzIT7RZFlhDcZo5iGKa9aSuR1z1mfOZo98GjdUTWt3Z0YVRkHxZiccyVKDqihjQcGurFu48N6e9LmHgMu301ka7bUfw+xOoQwMUwTPPQViIP6B4ztx7GsBpPZoV2h9F0OXlv9KIf+hNB1md9Z7OJlW9+tShcKYphmG20n8hnPGYuTWtQQxH0uJ04tkOK39yiI8XIFv3wmT7rpTJYqiHNXL5WmAFcnJGSYZgMbSfypqthWIMa1jCVCZIqhtvlwJkJ745ukappetHXrch60RFt3dpn3fDNrzYIajsOB+Exf+kbDMMw7UPbibzU48ahwV68evdRJsVvaZu44t+56IgaiqCrw4ETo/oTQe6NxArDN7+apGRF+ypLuFFBABfDMK1N24k8oAc5fe/OEpJpUZYLoyL7EN+h6Iga0jA1KZlFP0r5rO/km18tWXNUeQFcDMO0NraLPBH9ChEJIhq0e1vlosg+GB6R5bgw7jT5ahb9yBHsUkVHdvLNrxYzgItNNgzDwGaRJyI/gPcACNm5nUoxBHlC6sawp3SK3zFvF4Y9nZbml2tG0Y9tNwtFLkyhABieOFrN7fEGA71u7N/XY5ltk2GY9sPukfzvAfhVAHsqOuf4qAfdHc6ybeI7ZXk0RsyBbf7uit+H6MZWgc96aFnPaV/LIKjtKH49e2apAC6GYVof20SeiN4HYEYIcbHEci8Q0XkiOr+4uGhXd/LocDrwyefP4deePVH2dxTZZ1l0RM0U/Rj1dm1b3nry1bgpWGW9rBWK7MNiLI7ZEgFcDMO0PlWJPBG9QkRXLF7PAfgYgN8stQ4hxItCiHNCiHNDQ0PVdKcinjwyCP9A+YFIxYqOFCv6UazoSDm++dXCQVEMwxhUJfJCiGeEEGe2vwDcA3AQwEUiug9gEsAFIhqtvsuNwSg6kuuDvlPRD9NnfdtIPliGb361nBjth9vlYH95hmHsMdcIIS4LIYaFEAeEEAcATAN4XAgxb8f26kGP24Xj2zxmSqVF0H3WY6bP+uZWClfL9M2vBrfLgbMTXo58ZRimPf3kd4uRrsDwmFFDEbgchDMT1kU/FFlCKi3MoiNXZ6Nl++ZX3dcSAVwMw7QHdRH5zIh+qR7bshOj6Mi9Jb3oSKmiH9uLjpieODZ61uT2NZFM4/qcdQAXwzDtAY/kK8CwvV8IaUilBS5N7+zvbvisGxOgalgr2ze/6r4W8e5hGKa9YJGvgEODmaIjIQ23F2JYS6RK+torOUVHgiHNlnw1VoxnArjYw4Zh2hsW+Qowio4Ew5ppeilV9MMoOnJxOooZbcP2SVcDI4CLJ18Zpr1hka8QxS/h5vwKvndnqayiH8bI/U++/2be+3pgBHA9Wo3XbZsMw+wtWOQrJJDJ8vj1K/MI+KWSRT8Mn/WvXJpDh5Nwaqy/Tj3NziFcnObRPMO0KyzyFRKY1IUzmRZlmV4Mn/VkWuDUuLeoJ44dTE16d0x5zDBM68MiXyG+Xr3oCFC+6cWsGFUH//hcetwunBjtZ5FnmDaGRX4XGO6JU5NlinxmxF9Pe3x229YpjxmGaQ9Y5HfBh951GL/9j6bg7S6v6MfTJ4fxKz9+DD9+qv6pewJ+CbF4EncXV+u+bYZhGo+r0R1oRo6OeHC0giySXR1O/PxTR23sUXGMpwg1pFXUZ4ZhWgMeybc4ZgAXV4pimLaERb7FMVIe8+Qrw7QnLPJtgCL7cOthDKvxZKO7wjBMnWGRbwOUTADXJQ6KYpi2g0W+DTACuNhkwzDtB4t8G+DrdePgYC+nHWaYNoRFvk3ITXnMMEz7wCLfJiiyhKVVvfA4wzDtA4t8m2AGRbHJhmHaCltFnoj+FyK6SURXiei37dwWszPHRz3odDkQ5MlXhmkrbEtrQEQ/BuA5AFNCiDgRDdu1LaY0HU4Hpia9HPnKMG2GnSP5DwH4P4UQcQAQQizYuC2mDBTZh6szK4gnU1WtRwiB3/jSZXzv9lLBZ5/45m18/o3pqtbPMEztsFPkjwH4USL6ARF9m4jearUQEb1AROeJ6Pzi4qKN3WECfgmJVBrXZleqWs9cdBOffi2Ez7weymtPpQX+4L/dxR9/782q1s8wTO2oSuSJ6BUiumLxeg66KcgH4B0A/lcAf0kWtfKEEC8KIc4JIc4NDQ1V0x2mBEY++2r95Y3vb7fv33oYw3oihZsPY1hPcAoFhtkLVCXyQohnhBBnLF4vA5gG8AWh80MAaQCDteg0szvGvN0Y7e+qOvJVDel2/RltAwsrmznt+npTaYHL09GqtsEwTG2w01zzJQBPAQARHQPgBlBoxGXqiiJLVU++qiENfZ36nH2uS6Yaili2MwzTOOwU+T8GcIiIrgB4CcDzgsMtG07ALyG8vIGl1fiuvr+VSuPyTBTvV8bR4aQ8048a1vD2gwPYv6/HHO0zDNNYbHOhFEIkAPz3dq2f2R1GUFQwpOGZUyMVf//GXAzxZBpPHBrE5emoKebRjS3cWVjF+wPj8HS58Hd3H0EIAYtpGIZh6ghHvLYZZye8cDpo1yYb43sBWYIi+3BpOopkKm2mMQ74fVBkHxZiccxFN3daFcMwdYBFvs3odjtxcsyz68lXNaRh2NOJcW8XAn4J64kUbj1chRrSQARM+b0I+Dm1McPsFVjk25CAX8Kl6ShS6cqnSIJhDYosgYjyXDLVUARHh/vQ39WBk2P9cLscCHJ0LcM0HBb5NkTx+7AaT+LOwmpF34usJfDm0hoCft2uLw/0YKDXjQuhCNSwZo7g3S4Hzk54eSTPMHsAFvk2xBiBV+oBY3jSGN8nIih+CV+/Og9tfcuc1AX0/PWXZ6JIJNM16jXDMLuBRb4NOTjYC293R8UjbTUUgYOAqUmv2abIEmKbSfP/bLsP8WQaN+arS6HAMEx1sMi3IUSEgF+qOL2BGtZwYrQfPe6s561huul1O3F02JNtr1EKBYZhqoNFvk1RZAm3FmKIbW7ltW8kUvjXf3UNy2uJvPZ0WiAY1kzxNpjye3WvmkkJTkfWJ37c24VhTycuPNhbk6//9QchfPd2eyXCm4tu4N999Tq2Uvmms7V4Ev/q/7uG6PpWkW8yuyGRTOPffvU65itwIf74l6/ij757z5b+sMi3KYrsgxDApW05Zr57exGf/N6b+Mrlubz2e0uriG0mzclVg/6uDjz/xAF88O1yXrvhfbOXRvLJVBr/6q+u4hPfvNPortSVz5+fxh9+517BufjWzQX88fffxNevzjeoZ63J+QfLePE79/AFtbyU26m0wOfOh/Hg0bot/WGRb1MCk9aTr0bOme3tFzL2+8dzJlcNPv6+03jfY+MF7Yrsw/1H6wVPBY3ixnwMm1tpM4CrXSh2To05GS4kU1vM41rmnNfthRjWEqmCAVStYJFvU7w9HTg81FswujPSBxe0hzV4ulw4NNhb9jaMi/biHhnNG/u0saUHcLUDQohsamiLcwpw0FqtyT3e5aTrMn5ziswiz9SYgN8HNZS9EFNpgYvTGtwuB+4trkFbz47A1ZDuB+9wlJ+LZmrSCwdV7qppF2pI3zegfUavoWX9ScrtcuSJeSKpJ5pzuxy49TCG1Tjn/68FQgjzOluMxTGjbZT8jhrS4O3uwMEKBlCVwCLfxiiyhEdrCYSX9QvRKPrx/oBuejFGJGvxJG7Or+T5wZdDj9uFE6P9eybtsBqO4J1HBzHQ626b0auxn+8PjGMuuom5qH6ur8+tIJFM4/2BcaQFzNxDTHVMR/QMr8ZvqJzrTA1HzChyO2CRb2PMoKjMqNa4IJ9/8gCIsiJ/aTqKtNjd46QiSwiGNKR3kUKhlkTXt3BvcQ2K7IPil/bM04XdqKEIetxO/OO3+gEUmuP+hycPZpZjka8FxoDmg2+T0bnt6cmK2OYWbi+s2maPB1jk25rjIx50dzhzJooiGOh149RYP46PeAom5ozJ2koI+CXE4kncW2qsDTyYGakqfgmKLOHu4hqiG63vOhgMa5ia9OLshKSbbHImYUf6O3FyzINDFnMzzO4IhjR0dThwZsKLqUlvyfxNl6ajEAIVPyVXAot8G+NyOjA16TV/+MFM/plc90chBIIhDQcHe+HrdVe8DePivdDgkaIaimSyZEpmANdemRC2i82tFK7O6mY2t8uB0+P95kheDWtQ/D4zMC53bobZPWo4grMTXnQ4HQj4JVyZXUE8mSq+fGj3A6hyYZFvcwKyhOuzK1iMxXF7YRVK5rEx4JcQ3djCvaW1jCDs7iI8NNiL/i5Xw80BakjDsWEP+jpdZgBXo/tkN1dno0imhWkKUPw+XJrRsLCyiQeP1s3ANkX2YWk1julI6UlCpjjxZApXZ7JzV4rsQyKZxvW5WNHvqCENh4d64e3psK1fLPJtjuL3IZFK4zM/DOnvcy5QAPjKpTksxuK7du9yOAgB2ddQG7jhRmjsQ39XB44O97W8h41xEzNu0IosYXMrjZdeD+e3G/n/W/zJxm6uza4gkUrnHW+guHeZECKTvdU+Uw3AIt/2GBfip157YBb9AIAjQ33wdLrwqdceAEBVF2LAL+HWwxjWGuSm9+aSbn/PvVEZuXta2UShhjVMSN0Y7u8CkI1b+NRrD+B0EM5mEs2dGPWgq8NhmnKY3WHMaxhPSGPeboz0dxad7wgvb2B5LWGbf7yBbSJPRAEieo2IgkR0nojeZte2mN0z0t+FCakbi7E4jgzpRT8AfQT+mF/CYiyOTpcDJ8Y8JdZUHEWWMm560dIL24A5os1NhSz7oK1v4b5NoeR7gWBIyxOQSV83Bvs6sRiL48Sox0w053I6MDUhtfyTjd2oIQ2j/V0Y83abbUomFsVy+czxblqRB/DbAH5LCBEA8JuZ98weJGubzb/YjPdTk/pE0q7Xb6RQaJCIqOEIPJ0uHBnqM9t2m1O/WXi4sokZbSPvxpZbzcvqXF+d2XmSkNkZw989F0WWEFpex9JqvHD5kIbuDieOj+x+AFUOdoq8ANCf+d8LYNbGbTFVkJ1szTfJBHImYavB1+vGwcFeyxHN/aU1vBycKWiPrCXw56/eL9ucIoTAp197gMWY9Y9pyu/Ni9Y9OuxBr9tZ0eTrdGQdn3+jvKRTu+VrV+Zxfa4wB/9r9x7h1buPCtpvzK/ga1fmCtqN/dp+7gI7nOtEKo1rs+2V//9iWMO3biwUtD94tIYvlplgDACWVuMIL28UPd5WpjA1FMHZSS9cVQygysHOtX8EwH8gojCA3wHwUauFiOiFjDnn/OJie6WA3Ss8dWIYh4d68c5jg3nt5w4M4MSoB8+eGa16G0oRN70/+G938AsvBQt81l96PYzffPkqLs+UZ+K5vbCK3/jSFXw6M4dgsJFI4cZ8rODH53QQpiYrM1H80XffxK987iIWVspPIVsJW6k0PvJZFb/7N7cKPvvNl6/gN750uaD9975xCx9+KVhQgSsY1tDhJJwe789rf8+pERwZ7sOPHs0/18aIv9U9jrbz7/76On75cxcLrsv/8u17+MXPXkSkzOR6wSI3VSMF9/brbHMrhWtzK7v2WquEqkSeiF4hoisWr+cAfAjALwoh/AB+EcAnrdYhhHhRCHFOCHFuaGiomu4wu+TQUB/+9pffjUlfT167t7sDX/vIO/GW/QNVb0ORJSytFubyMERle1i9YUYpN0in2PKXZ/SC5VbZMxVZwo25GDYS5ZkojG3Y5YVyM5Mlc/uE8EomKnJ7AJcQAhdCGhIWFbjUUASnxr3o6nDmtR8b8eCVX3oXRjKTsQaj3i6MebvaKigqmdIzki6vJRBazp+bMa+nMtM9qOGIOXDIpdvtxIlRT8FxvTq7gq2UsDUIyqAqkRdCPCOEOGPxehnA8wC+kFn0cwB44rWNsRoprmxu4c7iakG74Vq2vX0njOWC4fwUCmawicWISZF9SKYFrsyWflowAosq6VOlGH3d7rN+KaxHRQL5AVyz0U3TPJXbJ0O8Kh0lKnJ7Tb7eeriK9cwNPvf4rcWTuPUwVtC+E2pIw8kxD7rdzoLPFFnCxbA+2MguX59JV8Bec80sgHdl/n8KwG0bt8XscY6PegpyeRji5XRQ3gSoIV7b23dCDWlwOgjRjS28+WjNbA+GNcgDPdjX11nwHUP4y9mGEVhUSZ8qxdgHIP+JxNje9gAuw0SwvU+3Hq5iYytVsYAE/BLCyxuW8xqtiHFD2378jFxN5Z7rVFrgYiZa3IqA34fVeBJ3F7OpPYJhDePeroInKjuwU+T/BYDfJaKLAP4tgBds3Bazx+nIpFDIzeVhpBr48VMjeSYK44f17OlR3H+0XtIuuhpP4tZCDM+e1ucOcie51G1uhLkMeTox6esuy0RhiOuzp0dxecaeoiPBsIZ3HRtCV0f+zTAY1nBkuA9Hh/sKjl+ny4F3HxvKvykYrnkVxjYYT1vtYrIJhjQM9Lrx1gM+y+P33tMjuBgunVzvzsIq1hKposfbypNLvy7tN9UANoq8EOJ7Qoi3CCEeE0K8XQjxhl3bYpoDRfbl5fJQwxoOD/XhnceGEFnfMsufqSENnS4HPvg2vaRgKdG5FNYgBPDTb5mEp9Nl/kjnohuYX9nc0WyhyMX9mHMxAovec2oE64naFx2JrCVwb2kN5w74cHbCa+5DNipS0n2uc2+GYQ1nJrx468GBvApcakjDvl43/APdRbdnxZlxL1wOKplUq1Uwj6vsw9XZFWxuZU03Bwd78e7jw1jZTOLe0trO6ylhejm4rxfe7g7zOlsw3VvtN9UAHPHK1BHFL5m5PPTiChEzKySQm/JYT/L0+H6prKIjhv1ekSU8lvHi0ddTGARl1ae56GbJostGYNH2vtaKbJZMny46GZ91o+iHsW0jgMso+qH4JfMmFsw5frvJT97tduLkWH9beNhEN7ZwJ5OrSfFLSKYFrs5GzaIfil/C42XGUpQq+uFwZJPAAfnXaz1gkWfqRiDnRxNaXkdkfQuK7MvzWU8k07gyuwJFlsouOqKGNBwa6oXU49Y9ZuZjWE8kEQzrFXpOjvUX/a7Rp51Gr7mBRfJADwZ63TVPARAMaXCQHnimZHzWr8/FcvLP+HImryO4Ma8X/VBkH85OejP2Yw3RjS3cXVzbdWxDwC/hYljLmyRsRQxvLkX25VyXGmY0veiHIks4NNgHT5er5JNkbvbWYgT8Em4t6BW4gmENLgfh9Li3dju0AyzyTN0Y83ZjtL8LakjLGWVLWZ/1kGZWLDIELZBJeVzMLqonH4uY9tCAX0IqLXB5Ogo1FMGZ8X6z5J8Vp8f74XbuXNwhN7CIiHSf/xrbrdWwhmMjHvR2uvLE3Cj6cWykD0eG+8ybYe7x63G7zPz/F8Oln152QpElrCVSuL1QPHNiK6CGNDNX07BHT+2Rf1x9BSNwK2KbW7i1ECs5KldkCULopkXdvbW/wL3VLljkmbpi5KnPipfHbL8+t4JX7z0y3wO6OSW2WbzoiF5uLZvkyRjBnn8Q0d0IS4hdp8uJU+M7myjUcCQvsEiRJdxZWK1Z0ZF0WiAYiph9NXzW1ZBmFv1wOR1wZvIJGcdvpL8TY94us08XwxreeJDJmz+5u1FiuwRFqaEIjuyopXcAABiESURBVA5nczVlr0u96Mfx0cx16ZdwY34F6wnr5HrlFv0ouC7rEARlwCLP1BUjl8c3by5gKmNm0Nt1n/X/+oNQRry6zXageNGRC9v84Pf1dWL/vh589vUw4sl0WXZPRZZwaUbDVhGPmWBIywssqnXRkXtLa1jZTBZkyXz9/jKuza3kpSAwboY/fHM5z0SgyD7E4kl8UZ3BsWEPPF27y09+YF8PpJ6Ols5IaaSezjVpKbIPM9oGXrn+0Cz6YbTvlFyv3KIfUo8bh4Z68fk3prGeSNXNswZgkWfqjCFY4eX85FnGDy60vJ7ninZosHdHu2gwrI+8ToxmkzwF/JIZwViObTrg1/Os35wvNFFYBRYZRUdq5WporEfJEx19QliPiswVf/1mOBvdLHr8qsk1ZFaKamEPmwePsvNBBnnXX077Y+akdvHr71CZRT8qvS5rBYs8U1fOTuSM3nMudMNnHcj3OihlF1VDGqYmpbwkT8Z6hzydmJBKuxEaKQ+s7Ow3H8YKAovMoiM1CopSQ3qWzMN5WTJzRu/+/BG+VbtRgUv/bnUCovh9uL2wipXN1qyBa5Xi9/R4PzqchdflQK8bB/b1WJ7rrCdOeaNy45z6ejqwf19PiaVrB4s8U1d0Nz191B3YJkbbq1Lltt+cXykoOhJPpnAt44ljuZ4SHg8Gep51t+UPOde7JW8b23zWq0ENaQjIUl6WTMNnPbfoB6DfuPwD3XlFP4BsBS6g+qLQ2UnCxuT/txs1pKHX7cTR4ezTX1eHE6cy3i5W198Fi+R64eUNPKqg6Ee2YpSvYvfWamCRZ+rOUydGMDWpezXktw9hyNOJsxP5k4aK37royNVt5dYMTo71Y8zbhadODJfVH8NEYZ0OVo+K3B5YFMjxWa+G9UQSNx8WZsnsdjvx5JFBy314+sQInji0zyz6kW0fhn+gG0eG+wq+UwmGiaJVc+0bT39OR77QPn1iGCfH+jHqzb8uA5niObPbYimMJ4JyTS8nRj2YkLrxY2Vel7XCVXoRhqktv/SeY/il9xwraP+AMokPKJMF7YEcu+gTh/eZ7cEcd7dc3C4HXv3o0xX1SZF9eOX6ArT1BKQed3Yb4YjlE4ExeguGI0WDYMrh8rSeuMpqNPjn/9Q6p9/H33fasv35Jw/g+ScP7LovBt7uDhwe6m3J9AabWylcn1vBC+88VPDZh58+ig8/fbSg3TzXIS3P/Gd44uTOB+2Ey+nA93/9qV32fPfwSJ7Z82SLjuSPLNUaJnlSLCbYout6YJGVAO+m6IgVxjyA3cWcK0WRa2eO2ktcmdETzVVi0jox2p9Jrld4/W2fD9qL7O3eMUwGIwApV3TUHN/yapnyS4VZHqetnxQAmD7rVYt8KIID+/Qo2r2EIkuWedabnWIVs3bC7XJk8gllz/XmVgrXZqN1S01QDSzyTFMQkHW7qFF0ZDGm51yvlStaX6cLx4bzizsEjajIIoFFAb/us24ktqoUwzujnu505ZJNw9xaJhs1HMGkrxtDnsLU0zsR8Eu4PBM1K3Bdm8sU/dhjT2BWsMgzTYHxY8otDgLUNsmTEfVopFBQw3pUZLHAIrPoSJklCrczF93EQixe18CYcjk+4kF3h7Pl7PLBXab4VWRfJrlefuEYHskzTI04MaYXHTFERw1F4HIQzkzULsmTIktm0REjKnKnkVq1o929LBSuTP7/VvKwmY9u6kFku3hyyk60Z6+/ehX9qBYWeaYp6NgmOsGwVvMkT2bRjJCG+4/Woa1v7SjAhs/6bqNDjaIfJ0aLZ8lsJNvzrDc7QYsgqHIZ83ZhpL8z7/rbi09gVrDIM01DwC/hSkZ0diq3tlsOD/WhL1N0xMxJUkIQAv7yio5YYRT92ClLZiMJ5ORZbwXUkAa304FT45XfVLPpHjQsxDYxHalf0Y9q2ZtXF8NYYNhFXw7O6OXWavwj0z1mvGbK2e1RkZZ9KrPoyHYSyTSuzNQ3G2GlZMvWtYZdXs08/XW6dvf0p8g+PHi0jm9eX8i837vnLhcWeaZpMH5Uf/L9+/p7GzwbFL8PN+Zj+Lu7S3jMXxgVWaxPlZbMuzG/ksmSuXcf+Uf6M3nWW2DyVU80V7zebzkYN+Q//bv7mdTT9Sn6US1ViTwR/QwRXSWiNBGd2/bZR4noDhHdJKL3VtdNhskWHbkxH7MtyZMi60VHigVBbedUGUVHrNjLk665BGTrdA/Nxo35GDa3qrupGhW4bszHcGqsfkU/qqXakfwVAD8F4Du5jUR0CsDPAjgN4FkAf0BEzXFEmD2NYYcvVW6t2vXr/5cWhHKKjlihhiIY9mSLfuxVFL+EGW0DCyuVmaP2GqpFOudKMSpwAfVNFVwtVYm8EOK6EOKmxUfPAXhJCBEXQrwJ4A4A60QcDFMBZsUom8wc+/o6IQ/oTwjl/pCNoiPJIkVHrNC9M+y5UdWSbOHyvTWavza7UtnxDmkY7HOb6ax3i93Xnx3YZZOfABDOeT+daSuAiF4govNEdH5xcdGm7jCtwpOHB0EEPJmTqKzW/MiRQRwf8ZQdFanIPmxupXHDouiIFctrCdx/tL7n8tVYcXrciw4nmRW49gLh5XX85P/zXXz2fLj0whnUcKQmT39/78ggOpyEcwf2/rkzKCnyRPQKEV2xeD2309cs2iwzHQkhXhRCnBNCnBsaGiq330ybcnbSi9c/9gzOHRiwbRv/+z88hc996ImylzdMAOWOdo1J2sf3uD0eyORZH+vfU3b58w+WIQTw+pvLZS2vrSdwb3GtJqPvZ8+M4tWPPo1JX/2KflRLyVTDQohndrHeaQD+nPeTAGZ3sR6GKWCwr7K8I5XS1eGsaFItt+jIP3nH/pLLqyGtoOjHXibgl/CX56eRTKX3RMZFY/6j/Jtq9fZ4AyKy/fqrNXadsS8D+Fki6iSigwCOAvihTdtimIaiB8r4ys7zEgxrOD7iKSj6sVdRZB82tlK49XC10V0BkBXtB4/WsbyWKGt5Ij3TaDtSrQvlB4hoGsATAL5CRF8HACHEVQB/CeAagK8B+JdCiNaIjWYYCxRZwr3FNWjrO4tOOi0ySbKaR3Cyk6+Nt8vrKX5X8Jb9mRQUZfRJDek31b7O5rip1ppqvWu+KISYFEJ0CiFGhBDvzfns3wghDgshjgsh/rr6rjLM3mV7Aqti3F1cRSyebCrvDHlAz3e/FyJfjaIfP/fEfjiodDSumWiuiW6qtabxBjaGaQGmJvWiI6VEPlsJqnlEx6yBuwfcKI0+PHl4ECdG+0v26c2lNUQ3tprqeNcaFnmGqQF9nXqgTKmRpRrS0N/lwqEq6sI2AsUv4c7CKqIbWw3thxrSzKIfSiYa18j/X2x5oLn82msNizzD1IjtRUesUEMRBGQfHCVy4uw1DJG82ODRfG7Jx4BfQiyexN3F4hPCajgCT6cLR4b66tXFPQeLPMPUCMXvM4uOWLEWT+LWw9iezjxZjCm/t6AGbr15uJJf9MMQ+536pIY0POaXmu6mWktY5BmmRhi554sFDl2ajiItSueo34v0d3XgyFBfxdk2a4lZhDtz/A4N9qK/y1XUX34jkcKN+Vhb2+MBFnmGqRlHhvrgyRQdscJoD0w2p+gosl40Q4ji5ig7UcMRuJ0OnM4U/XA4CAHZV7RE4eWZKFJp0daeNQCLPMPUDIeD8JhfKmo+UEMaDg32wtfrrnPPaoMi+6Ctb+H+o/WGbF8NFRb9UPwSbj2MYTWetFg+c1PlkTzDMLUi4JdwYz6GjUR+7J8QAmqo9iUL60m2cHnhyHk1nsR6olBoa0Uylcbl6WjB8QvIEtICuDRdeGNVQxrkgR7sa7I0BLWGRZ5haohRdGS76MxoG1hajTelPd7g2IgHvW6n5ZPKv/iz8/jIS0Hbtn3zYQwbW4UlH83kcBZ9CtpQB7gZYZFnmBpiiMr2IB1DhB5vYn9tp4MwNVkYFLW5lcL5B8t49e6jHd1Hq6HY8ZN63Dg02FvQp7noBuZXNpsi06fdsMgzTA3Z19eJ/ft6CkaWakhDV4cDx0d3Lgy+11FkCdfnVrC5lTVHXZ1dwVZKlPRZrwZ1h6IfAVmfB8mdEOYgqCws8gxTY6xSAKjhCM5OeNGxB1L1VkPALyGZFrgyEzXbcvfVrgpSwR2Kfih+CUurcUxHNvL65HY5cHKs35b+NBPNfcUxzB5E8UuYX9nEXFQXnXgyhauzKy0xqjTmFHKfVNRQBGPeLt1n3YZgqej6VqawuvXxM9rzbjahCM6M98PtYonjI8AwNWZ7JOb1uRgSyXRTRrpuZ9jThUlfd14sgBrS8Ljs29FnvRqC0zsX/Tg+6kFXh8M83lupNC5NR1viploLWOQZpsacHNNHkIbgGX9bRXQU2WcK6kJsEzPaBhRZQiDjs75m4bNeDWoosmPRjw6nA1MTknnjuTEXQzyZbvsgKAMWeYapMW6XA2fGs2lw1ZCG0f4ujHq7Gtyz2hDwS5iLbmI+ummmcFBkCYrpsx4tsYbKCIY1HBveuehHQJZwdWYF8WTKTL3A7pM6LPIMYwOK7MOl6Si2Ummo4UhLjSqzBVIiUMMaXA7C6XGvma6hlhWkjCCyUsdP8UtIpNK4NrsCNaRhyNOJCanQE6cdYZFnGBtQZAnxZBrfv7OE8PJGS4n86fF+uJ26DVwNRXBqvB9dHU74enWf9VpOvhpFP0qKfM7kqxrWoBTxxGlHWOQZxgYM0fmT79/Pe98KdLqcODXejzceRPQJzhyzSMBf6LNeDeX6u496uzDm7cI3byzgzaXinjjtCIs8w9jAuLcLQ55OfPvWIpwOwplxb6O7VFMCfgnnH0SwnkjlCaoi6z7rM9rGDt8un2BYQ1+nC4fLKPoR8Ev47u0l839GpyqRJ6KfIaKrRJQmonM57e8hojeI6HLm71PVd5VhmgciMke4J8c86HY7S3yjucg1n+QKajmFPCpBDUfwmN8LZxlFP4w+OQiYmmytm2o1VDuSvwLgpwB8Z1v7EoB/KIQ4C+B5AJ+qcjsM03QYgqf4W890YOSQ8fV0YP++HrN9u896NWwkUrg+Fyv7+BnH+/hoP3p38MRpN6oSeSHEdSHETYt2VQgxm3l7FUAXEbV3vk+m7TCSYz2+v/VMB0Yx7cdlX94E53af9XL4m6vzeOy3/gbR9fwi4UbRj3JNL2fGvXA7HZyUbBv1uN39IwCqECJu9SERvQDgBQCQZbkO3WGY+vC2gwP4w3/yFjx1YrjRXak5RIRPPn8Ovp7CAigBWcKf/t19xJOpvAIfxfjWzQVEN7ZwIRTBj+UcK8PfvVzPpG63E5/+52/HwcHeMveiPSg5kieiV4joisXruTK+exrAvwfwPxVbRgjxohDinBDi3NDQUGW9Z5g9DBHhvadHmz4pWTGmJiX4B3oK2hW/hEQyjetzsbLWY5h2tqdE2E3Rj7cdHMCQh40GuZQcyQshntnNioloEsAXAfycEOLubtbBMEzzkZ18jZQ0tazGk7j5UL8ZbM9gqYY0vP3QgD2dbCNsGWIQkQTgKwA+KoT4vh3bYBhmb2L4rJcz+XoprEEIQB7oQTCsmUVHjKIfrZDUrdFU60L5ASKaBvAEgK8Q0dczH/08gCMA/jciCmZerWeYZBjGEquc+lYYo/efe2I/YptJ3FvSi44YOXECHNRUNdV613xRCDEphOgUQowIId6baf8/hBC9QohAzmuhNl1mGGavo8gSQsvrWFq19LcwUUMaDg314t3H9THgBcM+nyn6cYqLflRNa84IMQzTUMxcMjuYbIQQCIYjUPw+HBrshafLlZO5k4t+1Ao+ggzD1Jwz4164HLSjv/x0ZANLqwkosgSHg8y8N1z0o7awyDMMU3O63U6cGPPsaJc37PGGB44i+3BzfgVvPIggnkxz/pkawSLPMIwtKH4fLob1qFUr1FAEXR0OnBj16Mtnio586tUH5numeljkGYaxBUWWsBpP4s7CquXnakjD1KQEVyZYzCg68rWr81z0o4awyDMMYwuGucWquHc8mcK12ZU8P3hfrxsHB3vNfDVc9KM2sMgzDGMLBwd74e3usLTLX5tdQSJVWGxbMe3zbKqpFSzyDMPYAhFBkSVcsBjJG9GwgW1phA1x50nX2sFJlxmGsQ3F78O3by0itrkFT1eH2a6GNYx7uzDq7cpb/gOPTyKZFnj7wX317mrLwiN5hmFsIyBLEAK4PB3Na1dDEQQsTDJ9nS78jz9ysKxKUEx5sMgzDGMbhsdMbobJxVgc05GNlqyYtRdhkWcYxja8PR04PNSb52FjTMTy5Gp9YJFnGMZWFNkHNaRBCD0oSg1F4HIQzkxwse16wCLPMIytBPwSHq0lMB3ZAKB71pwc60dXR+nSgEz1sMgzDGMrhlnmQiiCVFrg0rTGppo6wiLPMIytHB/xoLvDCTWk4fZCDGuJFIt8HWE/eYZhbMXldGBq0otgWMNxIxkZe9bUDR7JMwxjOwFZwrXZFfzg3iP4ejqwf19Po7vUNrDIMwxjO4rfh0Qqja9emefkY3Wm2kLeP0NEV4koTUTnLD6XiWiViH6lmu0wDNPcGDb4RDLNFZ/qTLUj+SsAfgrAd4p8/nsA/rrKbTAM0+SM9HeZ+eF50rW+VDXxKoS4DsDy0YuI3g/gHoC1arbBMExrEPBLmNE2MDXJIl9PbPGuIaJeAL8G4D0AdjTVENELAF4AAFmW7egOwzB7gH/+owehyBK83R2lF2ZqRkmRJ6JXAIxafPQxIcTLRb72WwB+TwixWmqCRQjxIoAXAeDcuXPWxSAZhml6FNnH9vgGUFLkhRDP7GK9bwfw00T02wAkAGki2hRCfGIX62IYhmF2iS3mGiHEjxr/E9HHAayywDMMw9Sfal0oP0BE0wCeAPAVIvp6bbrFMAzD1IJqvWu+COCLJZb5eDXbYBiGYXYPR7wyDMO0MCzyDMMwLQyLPMMwTAvDIs8wDNPCkFF3cS9ARIsAHlSxikEASzXqTrPQjvsMtOd+8z63D5Xu934hxJDVB3tK5KuFiM4LIQqyYbYy7bjPQHvuN+9z+1DL/WZzDcMwTAvDIs8wDNPCtJrIv9joDjSAdtxnoD33m/e5fajZfreUTZ5hGIbJp9VG8gzDMEwOLPIMwzAtTEuIPBE9S0Q3iegOEf16o/tjB0TkJ6JvEdH1TPH0X8i0DxDRN4joduZvS1ZlICInEalE9FeZ9weJ6AeZ/f4sEbkb3cdaQkQSEX2eiG5kzvkT7XCuiegXM9f3FSL6DBF1teK5JqI/JqIFIrqS02Z5fknnP2X07RIRPV7Jtppe5InICeD3AfwEgFMAPkhEpxrbK1tIAvhlIcRJAO8A8C8z+/nrAP5WCHEUwN9m3rcivwDges77fw+9+thRABEA/6whvbKP/wjga0KIEwAeg77vLX2uiWgCwIcBnBNCnAHgBPCzaM1z/acAnt3WVuz8/gSAo5nXCwD+cyUbanqRB/A2AHeEEPeEEAkALwF4rsF9qjlCiDkhxIXM/zHoP/oJ6Pv6Z5nF/gzA+xvTQ/sgokkAPwngjzLvCcBTAD6fWaSl9puI+gG8E8AnAUAIkRBCaGiDcw09/Xk3EbkA9ACYQwueayHEdwAsb2sudn6fA/DnQuc1ABIRjZW7rVYQ+QkA4Zz305m2loWIDgBQAPwAwIgQYg7QbwQAhhvXM9v4vwH8KoB05v0+AJoQIpl532rn/BCARQB/kjFR/RER9aLFz7UQYgbA7wAIQRf3KIA30NrnOpdi57cqjWsFkbeqFN6yfqFE1Afg/wXwESHESqP7YzdE9A8ALAgh3shttli0lc65C8DjAP6zEEIBsIYWM81YkbFBPwfgIIBxAL3QTRXbaaVzXQ5VXe+tIPLTAPw57ycBzDaoL7ZCRB3QBf4vhBBfyDQ/NB7dMn8XGtU/m/gRAO8jovvQTXFPQR/ZS5lHeqD1zvk0gGkhxA8y7z8PXfRb/Vw/A+BNIcSiEGILwBcAPInWPte5FDu/VWlcK4j86wCOZmbg3dAnar7c4D7VnIwd+pMArgsh/q+cj74M4PnM/88DeLnefbMTIcRHhRCTQogD0M/tN4UQ/x2AbwH46cxiLbXfQoh5AGEiOp5pehrANbT4uYZupnkHEfVkrndjv1v2XG+j2Pn9MoCfy3jZvANA1DDrlIUQoulfAP4+gFsA7gL4WKP7Y9M+/j3oj2iXAAQzr78P3T79twBuZ/4ONLqvNh6DdwP4q8z/hwD8EMAdAJ8D0Nno/tV4XwMAzmfO95cA+NrhXAP4LQA3AFwB8CkAna14rgF8Bvq8wxb0kfo/K3Z+oZtrfj+jb5ehex+VvS1Oa8AwDNPCtIK5hmEYhikCizzDMEwLwyLPMAzTwrDIMwzDtDAs8gzDMC0MizzDMEwLwyLPMAzTwvz/s4NS5kW7YBEAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(walk[:100])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 245,
   "metadata": {},
   "outputs": [],
   "source": [
    "nsteps = 1000\n",
    "draws = np.random.randint(0, 2, size=nsteps)\n",
    "steps = np.where(draws > 0, 1, -1)\n",
    "walk = steps.cumsum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 246,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-9"
      ]
     },
     "execution_count": 246,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "walk.min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 247,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "60"
      ]
     },
     "execution_count": 247,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "walk.max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 248,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(walk)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 249,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "297"
      ]
     },
     "execution_count": 249,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(np.abs(walk) >= 10).argmax()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Simulating Many Random Walks at Once"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 250,
   "metadata": {},
   "outputs": [],
   "source": [
    "nwalks = 5000\n",
    "nsteps = 1000\n",
    "draws = np.random.randint(0, 2, size=(nwalks, nsteps))\n",
    "steps = np.where(draws > 0, 1, -1)\n",
    "walks = steps.cumsum(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 251,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  1,   2,   3, ...,  46,  47,  46],\n",
       "       [  1,   0,   1, ...,  40,  41,  42],\n",
       "       [  1,   2,   3, ..., -26, -27, -28],\n",
       "       ...,\n",
       "       [  1,   0,   1, ...,  64,  65,  66],\n",
       "       [  1,   2,   1, ...,   2,   1,   0],\n",
       "       [ -1,  -2,  -3, ...,  32,  33,  34]])"
      ]
     },
     "execution_count": 251,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "walks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 252,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "122"
      ]
     },
     "execution_count": 252,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "walks.max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 253,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-128"
      ]
     },
     "execution_count": 253,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "walks.min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 254,
   "metadata": {},
   "outputs": [],
   "source": [
    "hits30 = (np.abs(walks) >= 30).any(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 255,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True,  True,  True, ...,  True, False,  True])"
      ]
     },
     "execution_count": 255,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hits30"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 256,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3368"
      ]
     },
     "execution_count": 256,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hits30.sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 257,
   "metadata": {},
   "outputs": [],
   "source": [
    "crossing_times = (np.abs(walks[hits30]) >= 30).argmax(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 258,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "509.99762470308787"
      ]
     },
     "execution_count": 258,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "crossing_times.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 259,
   "metadata": {},
   "outputs": [],
   "source": [
    "steps = np.random.normal(loc=0, scale=0.25, size=(nwalks, nsteps))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
